#include "Server.hpp"

//这个代码是串行的 在非阻塞的情况下，会导致收发消息错位！ 应该使用IO多路复用 or 多线程
int main(int argc, char* argv[]){
    if(argc != 3) return -1;

    std::string ip = argv[1];
    uint16_t port = std::stoi(argv[2]);

    Socket client;
    client.CreateClient(port, ip);
    //client.SetNonBlock();

    //让前五秒能发信息
    int cnt = 5;
    while(cnt--){
        //简单一点，先发送再收 不搞什么多线程了
        std::string str = "i am client";
        //std::getline(std::cin, str);
        ssize_t n = client.Send((void*)str.c_str(), str.size());
        if(n < 0){
            break;
        }
        else if(n == 0) {
            //可能是发送0个数据
            //也可能是因为非阻塞EAGAIN等错误，导致返回的 -> 不管怎么样 直接重发
            continue;
        }
        else{
            char buffer[1024] = {0};
            n = client.Recv(buffer, sizeof(buffer) - 1);
            if(n == 0){
                if(errno == EAGAIN || errno == EINTR || errno == EWOULDBLOCK){usleep(1000);}
                else std::cout << "服务器断开" << std::endl;
            }
            else if(n < 0){
                if(errno == EAGAIN || errno == EINTR) continue;
                else std::cout << "读取出错" << std::endl;
            }
            else{            
                std::cout << buffer << std::endl;
            }
        }
        sleep(1);
    }

    //后面直接死循环，看看能不能等待10s后，时间定时器执行超时任务，把这里给挂断！
    while(1){
        char buffer[1024] = {0};
        int n = client.Recv(buffer, sizeof(buffer) - 1);
        if(n <= 0) {
            std::cout << "出错" << std::endl;
            break;
        }
    }

    return 0;
}